package com.zh.test.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

/**
 * @describe redis配置文件
 * @author zh
 * @date 2021/9/26 9:59
 * @param
 * @return
 */
@Configuration
@Component
public class RedisConfig {

    Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    @Bean
    public RedisTemplate<String, Object> lettuceRedisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        logger.info("spring容器：  开始组装》redisTemplate《");
        //todo 通过注入不同的connectionFactory  来获取不同redis客户端
        final RedisTemplate<String, Object> template = new RedisTemplate<>();


        //使用jackson代替fastjson
        final Jackson2JsonRedisSerializer<?> fastJsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        //todo redis中的值为多种数据结构的类型，所有value都用json序列化器
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        //todo redis中的键一般是 字符串 ，所以直接用自带是String序列化器
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        //todo 不同的connectionFactory决定不同的实现redis方式
        // 通过溯源代码可知，不用的connectionFactory提供不同的TCP链接redis的过程，与redis接触的部分，
        // spring提供的仅仅是 《链接redis的前置动作与后置动作》这就是spring的拔插特性，spring可以有默认实现，同时允许随意拔插其他实现。
        template.setConnectionFactory(lettuceConnectionFactory);

        logger.info("spring容器：  结束组装》redisTemplate《");
        return template;



    }

}
